\section{Связь с внешним миром (win32)}

Иногда, чтобы понять, что делает та или иная функция, можно её не разбирать, а просто посмотреть на её входы и выходы.
Так можно сэкономить время.

Обращения к файлам и реестру: 
для самого простого анализа может помочь утилита Process Monitor\footnote{\url{http://go.yurichev.com/17301}}
от SysInternals.

Для анализа обращения программы к сети, может помочь  Wireshark\footnote{\url{http://go.yurichev.com/17303}}.

Затем всё-таки придётся смотреть внутрь. \\
\\
Первое на что нужно обратить внимание, это какие функции из \ac{API} \ac{OS}
и какие функции стандартных библиотек используются.
Если программа поделена на главный исполняемый файл и группу DLL-файлов, то имена функций в этих DLL, бывает так, могут помочь.

Если нас интересует, что именно приводит к вызову \TT{MessageBox()} с определенным текстом, 
то первое, что можно попробовать сделать: найти в сегменте данных этот текст, найти ссылки на него, и найти, 
откуда может передаться управление к интересующему нас вызову \TT{MessageBox()}.

\myindex{\CStandardLibrary!rand()}
Если речь идет о компьютерной игре, и нам интересно какие события в ней более-менее случайны, 
мы можем найти функцию \rand или её заменитель (как алгоритм Mersenne twister), и посмотреть, 
из каких мест эта функция вызывается и что самое главное: как используется результат этой функции.%

% BUG in varioref: http://tex.stackexchange.com/questions/104261/varioref-vref-or-vpageref-at-page-boundary-may-loop
Один пример: \ref{chap:color_lines}. 

Но если это не игра, а \rand используется, то также весьма любопытно, зачем. 
Бывают неожиданные случаи вроде использования \rand в алгоритме для сжатия данных (для имитации шифрования):
\href{http://go.yurichev.com/17221}{blog.yurichev.com}.

\subsection{Часто используемые функции Windows API}

Это функции которые можно увидеть в числе импортируемых.
Но также нельзя забывать, что далеко не все они были использованы в коде написанном автором.
Немалая часть может вызываться из библиотечных функций и \ac{CRT}-кода.
	
Многие ф-ции могут иметь суффикс \GTT{-A} для ASCII-версии и \GTT{-W} для Unicode-версии.

\begin{itemize}

\item
Работа с реестром (advapi32.dll): 
RegEnumKeyEx, RegEnumValue, RegGetValue, RegOpenKeyEx, RegQueryValueEx.

\item
Работа с текстовыми .ini-файлами (kernel32.dll):\\
GetPrivateProfileString.

\item
Диалоговые окна (user32.dll):\\
MessageBox, MessageBoxEx, CreateDialog, SetDlgItemText, GetDlgItemText.

\item
Работа с ресурсами (\myref{PEresources}): (user32.dll):
LoadMenu.

\item
Работа с TCP/IP-сетью (ws2\_32.dll):
WSARecv, WSASend.

\item
Работа с файлами (kernel32.dll):
CreateFile, ReadFile, ReadFileEx, WriteFile, WriteFileEx.

\item
Высокоуровневая работа с Internet
(wininet.dll):
WinHttpOpen.

\item
Проверка цифровой подписи исполняемого файла (wintrust.dll):
WinVerifyTrust.

\item
Стандартная библиотека MSVC (в случае динамического связывания)%
 (msvcr*.dll):
assert, itoa, ltoa, open, printf, read, strcmp, atol, atoi, fopen, fread, fwrite, memcmp, rand,
strlen, strstr, strchr.

\end{itemize}

\subsection{Расширение триального периода}

Ф-ции доступа к реестру это частая цель тех, кто пытается расширить триальный период ПО, которое
может сохранять дату/время инсталляции в реестре.

Другая популярная цель это ф-ции GetLocalTime() и GetSystemTime():
триальное ПО, при каждом запуске, должно как-то проверять текущую дату/время.

% FIXME language!
\subsection{Удаление nag-окна}

Популярный метод поиска того, что заставляет выводить nag-окно это перехват ф-ций MessageBox(),
CreateDialog() и CreateWindow().

\subsection{tracer: Перехват всех функций в отдельном модуле}
\myindex{tracer}

\myindex{x86!\Instructions!INT3}
В \tracer есть поддержка точек останова INT3, хотя и срабатывающие только один раз, но зато их можно установить на все
сразу функции в некоей DLL.

\begin{lstlisting}
--one-time-INT3-bp:somedll.dll!.*
\end{lstlisting}

Либо, поставим INT3-прерывание на все функции, имена которых начинаются с префикса \TT{xml}:

\begin{lstlisting}
--one-time-INT3-bp:somedll.dll!xml.*
\end{lstlisting}

В качестве обратной стороны медали, такие прерывания срабатывают только один раз.
Tracer покажет вызов какой-либо функции, если он случится, но только один раз.
Еще один недостаток --- увидеть аргументы функции также нельзя.

Тем не менее, эта возможность очень удобна для тех ситуаций, 
когда вы знаете что некая программа использует некую DLL,
но не знаете какие именно функции в этой DLL.

И функций много. 

\par
\myindex{Cygwin}
Например, попробуем узнать, что использует cygwin-утилита uptime:

\begin{lstlisting}
tracer -l:uptime.exe --one-time-INT3-bp:cygwin1.dll!.*
\end{lstlisting}

Так мы можем увидеть все функции из библиотеки cygwin1.dll, которые были вызваны хотя бы один раз, и откуда:

\lstinputlisting{digging_into_code/uptime_cygwin.txt}

